/**
 * Company : Thai Informatic System Co., Ltd.
 * Created By : Dr.Tree
 * Created On : Aug 6, 2012  4:40:24 PM 
 * e-Mail : chatree@tis.co.th
 * Mobile Phone : (+66) 087-921-5115
 * Package Name : apps.business.process.commons.customer
 * File Name : WorkQueue.java
 * TODO
 */
package apps.business.process.commons.customer;

import java.util.LinkedList;

/**
 * @author Administrator
 *
 */
public class WorkQueue {
	
	 private final int nThreads;
	    private final PoolWorker[] threads;
	    private final LinkedList queue;

	    public WorkQueue(int nThreads)
	    {
	        this.nThreads = nThreads;
	        queue = new LinkedList();
	        threads = new PoolWorker[nThreads];

	        for (int i=0; i<nThreads; i++) {
	            threads[i] = new PoolWorker();
	            threads[i].start();
	        }
	    }

	    public void execute(Runnable r) {
	        synchronized(queue) {
	            queue.addLast(r);
	            queue.notify();
	        }
	    }

	    private class PoolWorker extends Thread {
	        public void run() {
	            Runnable r;

	            while (true) {
	                synchronized(queue) {
	                    while (queue.isEmpty()) {
	                        try
	                        {
	                            queue.wait();
	                        }
	                        catch (InterruptedException ignored)
	                        {
	                        }
	                    }

	                    r = (Runnable) queue.removeFirst();
	                }

	                // If we don't catch RuntimeException, 
	                // the pool could leak threads
	                try {
	                    r.run();
	                }
	                catch (RuntimeException e) {
	                    // You might want to log something here
	                }
	            }
	        }
	    }


}
